其他
面试必知必会|堆和优先队列
优先队列的概念
优先队列的实现
优先队列的应用
1.优先队列的概念
优先队列是计算机科学中的一类抽象数据类型。
优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务;
优先级相同的元素按照其在优先队列中的顺序得到服务。
优先队列至少需要支持下述操作:
a.插入带优先级的元素
b.取出具有最高优先级的元素
c.查看最高优先级的元素。
综合考虑插入和删除的性能 优先队列一般采用堆来实现。
维基百科-优先队列
template<class T>
class priqueue {
public:
//构造函数 初始化
priqueue(int maxsize);
//将T类型新元素添加到队列中
void insert(T t);
//获取队列中最小的元素
T extractmin();
};
2.优先队列的实现
有序序列
无序序列
堆结构
复杂度对照
小结
基于模板化和堆的优先队列的简单实现
template<class T>
class priqueue {
private:
int n,maxsize;
T *x;
void swap(int i,int j)
{ T t = x[i]; x[i] = x[j]; x[j] = t; }
public:
//初始化
priqueue(int m)
{
maxsize = m;
x = new T[maxsize+1];
n = 0;
}
//插入新数据
void insert(T t)
{
int i,p;
x[++n] = t;
//末尾添加新数据 执行siftup操作
for (i = n; i > 1 && x[p=i/2] > x[i]; i = p)
swap(p,i);
}
//提取操作
T extractmin()
{
int i,c;
//提取堆顶元素
T t = x[1];
//将尾部元素放到堆顶
x[1] = x[n--];
//针对新堆顶进行siftdn操作
for (i = 1; (c = 2*i) <= n; i = c) {
if (c+1 <= n && x[c+1] < x[c])
c++;
if (x[i] <= x[c])
break;
swap(c,i);
}
return t;
}
};
优先队列的自定义优先级
容器元素的类型
存储数据所用的容器
比较函数 缺省情况是less<T>
#include<quque>
// 队列和优先队列的声明
std::queue<T> pq;
std::priority_queue<T, std::vector<T>, cmp> pq;
//模板化优先队列的主要参数
priority_queue<Type, Container, Func>
//举例
priority_queue<pair<char,int>,vector<pair<char,int>>,compare> pq;
//自定义比较函数
struct compare
{
bool operator()(const pair<char,int> a,const pair<char,int> b){
return b.second > a.second;
}
};
4.优先队列的应用
TopN问题
//默认的比较函数是less 也就是优先队列相当于最大堆
//堆顶元素为最大值
priority_queue<int,vector<int>,less<int>> q;
int findKthLargest(vector<int>& nums, int k)
{
priority_queue<int> q(nums.begin(),nums.end());
for(int i=0;i<k-1;i++)
q.pop();
return q.top();
}
优先队列和贪心算法
贪心算法又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望导致结果是最好或最优的算法。
贪心算法在有最优子结构的问题中尤为有效。
最优子结构的意思是局部最优解能决定全局最优解。
简单地说问题能够分解成子问题来解决,子问题的最优解递推到最终问题的最优解。
维基百科-贪心算法
旅行商TSP问题
01背包问题
霍夫曼编码问题
最短路径Dijkstra算法
最小生成树Prim算法
5.参考资料
《编程珠玑》
http://www.laicar.com/book/echapter/5cb0a77e739207662ac8710c/links/item10/OEBPS/Text/part0009.xhtml
维基百科
https://my.oschina.net/u/1246663/blog/227115
6.往期精彩
理解Redis持久化
Linux中的各种锁及其基本原理
浅析CPython的全局解释锁GIL
浅谈Linux下Socket选项设置
深入理解IO复用之epoll